<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>java reference - meran的专栏 - 博客频道 - CSDN.NET</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="（因为最近写个小工具，在手机平台上需要用到，所以整理了大部分相关文档，希望对读者有用，若有笔误请来信告诉谢谢：silentbalanceyh@126.com）1.Java垃圾回收器概述　　Java2平台里面引入了java.lang.ref包，这个包中的类可以让我们引用对象，而是的" />
<script src="http://static.blog.csdn.net/scripts/jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/ad.js?v=1.1"></script>
<link rel="Stylesheet" type="text/css" href="http://static.blog.csdn.net/skin/default/css/style.css?v=1.1" />
<link id="RSSLink" title="RSS" type="application/rss+xml" rel="alternate" href="/zhao251021539/rss/list" />
<link rel="shortcut icon" href="/favicon.ico" />
<link type="text/css" rel="stylesheet" href="http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/default.css" />
</head>
<body>
<script src="http://csdnimg.cn/pubnav/js/pub_topnav_2011.js"type="text/javascript"></script>

<div id="container">
<div id="header">
    <div class="header">
        <div id="blog_title">
            <h1><a href="/zhao251021539">meran的专栏</a></h1>
            <h2>生活就是一系列猛然的醒悟</h2>
            <div class="clear"></div>
        </div>
        <div class="clear"></div>
    </div>
</div>
<div id="navigator">
    <div class="navigator_bg"></div>
    <div class="navigator">
        <ul>
            <li id="btnContents"><a href="/zhao251021539?viewmode=contents"><span><img src="http://static.blog.csdn.net/images/ico_list.gif">目录视图</span></a></li>
            <li id="btnView"><a href="/zhao251021539?viewmode=list"><span><img src="http://static.blog.csdn.net/images/ico_summary.gif">摘要视图</span></a></li>
            <li id="btnRss"><a href="/zhao251021539/rss/list"><span><img src="http://static.blog.csdn.net/images/ico_rss.gif">订阅</span></a></li>
</ul>
    </div>
</div>
<script type="text/javascript">
    var username = "zhao251021539";
    var _blogger = username;
    var blog_address = "http://blog.csdn.net/zhao251021539";
    var static_host = "http://static.blog.csdn.net";
    var currentUserName = "";
</script>

<div id="body">
<div id="main">
<div class="main">
<div class="notice"> 

<a href="http://events.csdn.net/DR2013/roadshow/index.html" target="_blank">
<font color=red>【免费】全新海外营销策论分享 
   </font></a>



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<a href="http://bbs.csdn.net/topics/390422723" target="_blank"><font color=blue>CSDN社区4月技术大分享活动火爆开始
</font></a>

&nbsp;&nbsp;&nbsp;&nbsp;

<a href="http://blog.csdn.net/blogdevteam/article/details/8699892" target="_blank"><font color=blue>写“书评”赢下载分！ 


</font></a>

<br />





<a href="http://blog.csdn.net/csdnproduct/article/details/8789396"target="_blank">
<font color=blue>公告：CSDN新版首页上线 


 </font></a>

&nbsp;&nbsp;&nbsp;&nbsp;

<a href="http://e.weibo.com/csdnsupport
"target="_blank">
<font color=red>欢迎关注CSDN产品客服微博
 </font></a>



&nbsp;&nbsp;&nbsp;&nbsp;

<a href="http://www.csdn.net/article/2013-04-10/2814826"target="_blank">
<font color=red>专访熊攀峰：HTML5时代 Flash仍是座宝藏

 </font></a>






</div>
<div id="article_details" class="details">
    <div class="article_title">
    <span class="ico ico_type_Repost"></span>
    <h3>
        <span class="link_title"><a href="/zhao251021539/article/details/6599407">
        java reference
        </a></span>
    </h3>
</div>

        
    <div class="article_manage">
        <span class="link_categories">
        分类：
            <a href="/zhao251021539/article/category/848282">java虚拟机</a> 
        </span>
    <span class="link_postdate">2011-07-12 10:27</span>
    <span class="link_view" title="阅读次数">571人阅读</span>
    <span class="link_comments" title="评论次数"><a href="#comments">评论</a>(1)</span>
    <span class="link_collect"><a href="javascript:void(0);" onclick="javascript:collectArticle('java reference','6599407');return false;" title="收藏">收藏</a></span>
    <span class="link_report"><a href="#report"  onclick="javascript:report(6599407,2);return false;" title="举报">举报</a></span>
    
</div>
<div class="tag2box"><a href='http://blog.csdn.net/tag/details.html?tag=java' target=_blank>java</a><a href='http://blog.csdn.net/tag/details.html?tag=reference' target=_blank>reference</a><a href='http://blog.csdn.net/tag/details.html?tag=jvm' target=_blank>jvm</a><a href='http://blog.csdn.net/tag/details.html?tag=null' target=_blank>null</a><a href='http://blog.csdn.net/tag/details.html?tag=%e7%ae%97%e6%b3%95' target=_blank>算法</a><a href='http://blog.csdn.net/tag/details.html?tag=%e5%b7%a5%e4%bd%9c' target=_blank>工作</a></div>


    
<div id="article_content" class="article_content">
&nbsp;（因为最近写个小工具，在手机平台上需要用到，所以整理了大部分相关文档，希望对读者有用，若有笔误请来信告诉谢谢：<a href="mailto:silentbalanceyh@126.com"><span style="font-size:13px;">silentbalanceyh@126.com</span></a><span style="font-size:13px;">）</span><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><strong><span style="font-size:13px;">1.Java垃圾回收器概述</span></strong></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">　　Java2平台里面引入了java.lang.ref包，这个包中的类可以让我们引用对象，而是的这些对象不用停留在内存中。不仅仅如此，这些类和Java本身的垃圾回收器还存在一定的交互。我们平时开发的时候有时候会用到System.gc()方法，而Java里面GC的基本工作原理又是如何呢？当然使用Java引用类主要目的是为了和Java垃圾回收器进行有限的交互，从而全面提升内存的管理效率，这种情况在嵌入式系统和实时系统以及一些对内存要求严格的系统里面比较凑效。</span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><strong><span style="font-size:13px;">1）GC的基本原理</span></strong></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">　　Java的内存管理主要指的是对内存中的对象的管理，包括针对这些对象进行内存的分配和释放等各种操作，学过Java的人都了解Java本身的内存模型，对于一个Java的对象而言，存储主要分为两种，一种是内存堆(Heap)，内存堆是无序的，主要用来存放创建的Java对象；一种是内存栈(Stack)，主要用来存放Java引用，然后在管理过程使用Java引用指向Java对象。而GC就是负责在对象“不可达”的时候将对象回收，常见的语句例如：</span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">Object o =<span style="color:#3366ff;"><span>&nbsp;</span><span style="color:#3366ff;">null;</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">　　而CG本身是如何工作的呢？当系统在创建对象的时候，即当我们使用new关键字创建一个对象的时候，GC就开始监控对象的地址、大小以及使用状态。一般情况下，Java的GC机制都有特定的回收算法，GC通常会使用有向图的方式来记录队中的所有对象，通过此种方式确定哪些对象是“可达的”，而哪些是“不可达的”。当GC判断一些对象不可达的时候，GC就有责任回收相关内存空间。但是，因为平台的不同，往往在调用System.gc()的时候，存在太多不确定性，可以这样认为，当程序调用了System.gc()过后，仅仅是程序向JVM发送了请求，至于JVM究竟在什么时候进行垃圾回收，不同的平台不一样。<span style="color:#ff0000;">（*：需要解决的误区是不要觉得System.gc()调用了过后，垃圾回收器一定会对系统内存进行回收，系统回收相关内存取决于平台和系统。）</span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#000000;"><strong><span style="font-size:13px;">2）增量方式GC（IncrementalGC）</span></strong></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="font-size:13px;">　　<span style="color:#000000;">GC在JVM中通常是启动了一个新的进程或者一组新的进程，它本身和Java用户程序一样需要占用heap空间，运行时也占用CPU。设计GC的时候，必须要在停顿时间和回收率之间进行权衡，原因在于它本身占用了Heap，如果GC运行时间太长，用户就会感觉到Java程序本身会有一定的停顿，如果运行时间太短，则有很多内存没有回收，使得程序里面创建的Java对象占用了大量的内存。增量方式的GC就是通过一定的回收算法，把一个长时间的中断，分成很多小的中断，通过这种方式减少GC对程序本身的影响。其实增量方式整体性能比不上普通的高，但是能够减少停顿时间，改善使用者的用户体验。当然除了这样的方式，GC整体的方式为：</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#339966;">引用计数法(Reference Counting Collector) ；</span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#339966;"><span style="font-size:13px;">　　Tracing算法(Tracing Collector)；</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#339966;"><span style="font-size:13px;">　　Compacting算法(Compacting Collector) ；</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#339966;"><span style="font-size:13px;">　　Copying算法(Coping Collector) ；</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#339966;"><span style="font-size:13px;">　　Generation算法(Generational Collector) ；</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#339966;"><span style="font-size:13px;">　　Adaptive算法(Adaptive Collector) ；</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　至于相关的算法可以去查阅相关的文档</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#000000;"><strong><span style="font-size:13px;">2.Java中的对象引用分类</span></strong></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　Java中的对象引用主要有以下几种类型：</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><strong><span style="color:#3366ff;"><span style="font-size:13px;">　　1）强可及对象（strongly reachable）：</span></span></strong></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;"><strong><span style="color:#3366ff;">　　</span></strong>可以通过强引用访问的对象，一般来说，我们平时写代码的方式都是使用的强引用对象，比如下边的代码段：</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　StringBuilder builder= <span style="color:#3366ff;">new</span> StringBuilder()；</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　上边代码部分引用obj这个引用将引用内存堆中的一个对象，这种情况下，只要obj的引用存在，垃圾回收器就永远不会释放该对象的存储空间。这种对象我们又成为<span style="color:#3366ff;"><strong>强引用（Strong references），</strong></span>这种强引用方式就是Java语言的原生的Java引用，我们几乎每天编程的时候都用到。上边代码JVM存储了一个StringBuilder类型的对象的强引用在变量builder呢。强引用和GC的交互是这样的，如果一个对象通过强引用可达或者通过强引用链可达的话这种对象就成为<span style="color:#3366ff;"><strong>强可及对象</strong></span>，这种情况下的对象垃圾回收器不予理睬。如果我们开发过程不需要垃圾回器回收该对象，就直接将该对象赋为前引用。<br /></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#3366ff;"><strong><span style="font-size:13px;">　　2）软可及对象（softly reachable）：</span></strong></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　不通过强引用访问的对象，即不是强可及对象，但是可以通过软引用访问的对象就成为软可及对象，软可及对象就需要使用类<span style="color:#ff9900;">SoftReference（java.lang.ref.SoftReference）</span>。此种类型的引用主要用于内存比较敏感的高速缓存，而且此种引用还是具有较强的引用功能，当内存不够的时候GC会回收这类内存，因此如果内存充足的时候，这种引用通常不会被回收的。不仅仅如此，这种引用对象在JVM里面保证在抛出OutOfMemory异常之前，设置成为<span style="color:#3366ff;">null</span>。通俗地讲，这种类型的引用保证在JVM内存不足的时候全部被清楚，但是有个关键在于：垃圾收集器在运行时是否释放软可及对象是不确定的，而且使用垃圾回收算法并不能保证一次性寻找到所有的软可及对象。当垃圾回收器每次运行的时候都可以随意释放不是强可及对象占用的内存，如果垃圾回收器找到了软可及对象过后，可能会进行以下操作：</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【1】将SoftReference对象的referent域设置成为null，从而使该对象不再引用heap对象。</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【2】SoftReference引用过的内存堆上的对象一律被生命为finalizable。</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【3】当内存堆上的对象finalize()方法被运行而且该对象占用的内存被释放，SoftReference对象就会被添加到它的ReferenceQueue，前提条件是ReferenceQueue本身是存在的。</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　既然Java里面存在这样的对象，那么我们在编写代码的时候如何创建这样的对象呢？创建步骤如下：</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　先创建一个对象，并使用普通引用方式【强引用】，然后再创建一个SoftReference来引用该对象，最后将普通引用设置为null，通过这样的方式，这个对象就仅仅保留了一个SoftReference引用，同时这种情况我们所创建的对象就是SoftReference对象。一般情况下，我们可以使用该引用来完成Cache功能，就是前边说的用于高速缓存，保证最大限度使用内存而不会引起内存泄漏的情况。下边的代码段：</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px"><span style="color:#3366ff;"><span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>public static void </span>main(<span style="color:#800080;"><span style="color:#993366;">String</span> </span>args[])</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;"><span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>{</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#339966;">//创建一个强可及对象</span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>A a = <span style="color:#3366ff;"><span style="BACKGROUND-COLOR: #ffffff">new </span></span>A();</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#339966;">//创建这个对象的软引用SoftReference</span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="color:#000000;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span></span></span><span style="color:#993366;"><span style="color:#800080;">SoftReference</span> </span>sr = <span style="color:#3366ff;">new</span> <span style="color:#800080;">SoftReference</span>(a);</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#339966;">//将强引用设置为空，以遍垃圾回收器回收强引用</span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="color:#000000;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span></span></span>a = <span style="color:#3366ff;">null</span>;</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#339966;">//下次使用该对象的操作</span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="color:#000000;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span></span></span><span style="color:#3366ff;">if</span>( sr != <span style="color:#3366ff;">null</span> ){</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#3366ff;"><span style="color:#000000;">　　a = (A)sr.get();</span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>}<span style="color:#3366ff;">else</span>{</span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#3366ff;"><span style="color:#000000;">　　<span style="color:#339966;">//这种情况就是由于内存过低，已经将软引用释放了，因此需要重新装载一次</span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px">　　<span style="COLOR: #3366ff"><span style="color:#000000;">　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>　a = <span style="color:#3366ff;">new</span> A();</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 13px">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span><span style="color:#3366ff;"><span style="color:#000000;">　　sr = <span style="color:#3366ff;">new</span> <span style="color:#800080;">SoftReference</span>(a);</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>}</span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;"><span style="color:#3366ff;"><span style="color:#000000;">　　</span></span>}</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　软引用技术使得Java系统可以更好地管理内存，保持系统稳定，防止内存泄漏，避免系统崩溃，因此在处理一些内存占用大而且生命周期长使用不频繁的对象可以使用该技术。</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#3366ff;"><strong>3)弱可及对象（weakly reachable）：</strong></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　不是强可及对象同样也不是软可及对象，仅仅通过弱引用<span style="color:#ff9900;">Weak</span><span style="color:#ff9900;">Reference（java.lang.ref.WeakReference）</span>访问的对象，这种对象的用途在于规范化映射（canonicalized mapping），对于生存周期相对比较长而且重新创建的时候开销少的对象，弱引用也比较有用，和软引用对象不同的是，垃圾回收器如果碰到了弱可及对象，将释放WeakReference对象的内存，但是垃圾回收器需要运行很多次才能够找到弱可及对象。弱引用对象在使用的时候，<strong>可以配合</strong>ReferenceQueue类使用，如果弱引用被回收，JVM就会把这个弱引用加入到相关的引用队列中去。最简单的弱引用方法如以下代码：</span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#800080;">WeakReference</span> weakWidget = <span style="color:#3366ff;">n</span><span style="color:#3366ff;"><span style="color:#3366ff;">ew</span><span style="color:#993366;"> </span></span><span style="color:#800080;">WeakReference(</span>classA);</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　在上边代码里面，当我们使用weakWidget.get()来获取classA的时候，由于弱引用本身是无法阻止垃圾回收的，所以我们也许会拿到一个<span style="color:#3366ff;">null<span style="color:#000000;">为</span></span>返回。<span style="color:#ff0000;">【*：这里提供一个小技巧，如果我们希望取得某个对象的信息，但是又不影响该对象的垃圾回收过程，我们就可以使用WeakReference来记住该对象，一般我们在开发调试器和优化器的时候使用这个是很好的一个手段。】</span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="FONT-SIZE: 13px">　　<span style="color:#000000;">如果上边的代码部分，我们通过weakWidget.get()返回的是null就证明该对象已经被垃圾回收器回收了，而这种情况下弱引用对象就失去了使用价值，GC就会定义为需要进行清除工作。这种情况下弱引用无法引用任何对象，所以在JVM里面就成为了一个死引用，这就是为什么我们有时候需要通过<span style="color:#3366ff;">ReferenceQueue</span>类来配合使用的原因，使用了<span style="color:#3366ff;">R</span><span style="color:#3366ff;"><span style="color:#3366ff;">eferenceQueue</span><span style="color:#000000;">过</span></span>后，就使得我们更加容易监视该引用的对象，如果我们通过一<span style="color:#3366ff;">ReferenceQueue</span>类来构造一个若引用，当若引用的对象已经被回收的时候，系统将自动使用对象引用队列来代替对象引用，而且我们可以通过<span style="color:#3366ff;">ReferenceQueue</span>类的运行来决定是否真正要从垃圾回收器里面将该死引用（Dead Reference）清除。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　弱引用代码段：</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#339966;">//创建普通引用对象</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<span style="color:#800080;">M</span><span style="color:#800080;"><span style="color:#800080;">yObject </span><span style="color:#000000;">o</span></span><span style="color:#000000;">bject</span> = <span style="color:#3366ff;">new </span><span style="color:#800080;">MyObject</span>();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#339966;">//创建一个引用队列</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#800080;">ReferenceQueue</span> rq = <span style="color:#3366ff;">new</span> <span style="color:#800080;">ReferenceQueue</span>();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#339966;">//使用引用队列创建MyObject的弱引用</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#800080;">WeakReference</span> wr = <span style="color:#3366ff;">new</span> <span style="color:#800080;">WeakReference</span>(object,rq);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">　　这里提供两个实在的场景来描述弱引用的相关用法：</span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">　　<span style="color:#888888;"><em>（1）你想给对象附加一些信息，于是你用一个 Hashtable 把对象和附加信息关联起来。你不停的把对象和附加信息放入 Hashtable 中，但是当对象用完的时候，你不得不把对象再从 Hashtable 中移除，否则它占用的内存变不会释放。万一你忘记了，那么没有从 Hashtable 中移除的对象也可以算作是内存泄漏。理想的状况应该是当对象用完时，Hashtable 中的对象会自动被垃圾收集器回收，不然你就是在做垃圾回收的工作。</em></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;"><span style="color:#888888;"><em>　　（2）你想实现一个图片缓存，因为加载图片的开销比较大。你将图片对象的引用放入这个缓存，以便以后能够重新使用这个对象。但是你必须决定缓存中的哪些图片不再需要了，从而将引用从缓存中移除。不管你使用什么管理缓存的算法，你实际上都在处理垃圾收集的工作，更简单的办法（除非你有特殊的需求，这也应该是最好的办法）是让垃圾收集器来处理，由它来决定回收哪个对象。</em></span> </span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="font-size:13px;">　　当Java回收器遇到了弱引用的时候有可能会执行以下操作：</span></p><p>&nbsp;</p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#666699;">【1】将WeakReference对象的referent域设置成为null，从而使该对象不再引用heap对象。</span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【2】WeakReference引用过的内存堆上的对象一律被生命为finalizable。</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【3】当内存堆上的对象finalize()方法被运行而且该对象占用的内存被释放，WeakReference对象就会被添加到它的ReferenceQueue，前提条件是ReferenceQueue本身是存在的。</span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="color:#666699;"><span style="font-size:13px;">　　<span style="color:#3366ff;"><strong>4)清除：</strong></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="color:#3366ff;"><span style="font-size:13px;"><strong>　　</strong><span style="color:#000000;">当引用对象的referent域设置为null，并且引用类在内存堆中引用的对象声明为<em>可结束的</em>时候，该对象就可以清除，清除不做过多的讲述</span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<strong><span style="color:#3366ff;">5)虚可及对象（phantomly reachable）：</span></strong></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　不是强可及对象，也不是软可及对象，同样不是弱可及对象，之所以把虚可及对象放到最后来讲，主要也是因为它的特殊性，有时候我们又称之为“幽灵对象”，已经结束的，可以通过虚引用来访问该对象。我们使用类<span style="color:#ff6600;">PhantomReference（java.lang.ref.PhantomReference）</span>来访问，这个类只能用于跟踪被引用对象进行的收集，同样的，可以用于执行per-mortern清除操作。<span style="color:#800080;">PhantomReference</span><strong>必须</strong>与<span style="color:#800080;">ReferenceQueue</span>类一起使用。需要使用<span style="color:#800080;">ReferenceQueue</span>是因为它能够充当通知机制，当垃圾收集器确定了某个对象是虚可及对象的时候，<span style="color:#800080;">PhantomReference</span>对象就被放在了它的ReferenceQueue上，这就是一个通知，表明<span style="color:#800080;">PhantomReference</span>引用的对象已经结束，可以收集了，一般情况下我们刚好在对象内存在回收之前采取该行为。这种引用不同于弱引用和软引用，这种方式通过get()获取到的对象总是返回<span style="color:#3366ff;">null</span>，仅仅当这些对象在<span style="color:#800080;">ReferenceQueue</span>队列里面的时候，我们可以知道它所引用的哪些对对象是死引用（Dead Reference）。而这种引用和弱引用的<span style="color:#ff0000;">区别</span>在于：</span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<strong>弱引用（WeakReference）</strong><span style="color:#ff0000;">是在对象不可达的时候尽快进入<span style="color:#800080;">ReferenceQueue</span>队列的，在finalization方法执行和垃圾回收之前是确实会发生的，理论上这类对象是不正确的对象，但是<span style="color:#800080;">WeakReference</span>对象可以继续保持Dead状态，</span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:13px;">　　<strong>虚引用（PhantomReference）</strong><span style="color:#ff0000;">是在对象确实已经从物理内存中移除过后才进入的<span style="color:#800080;">ReferenceQueue</span>队列，而且get()方法会一直返回<span style="color:#3366ff;">null</span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="font-size:13px;">　　<span style="color:#000000;">当垃圾回收器遇到了虚引用的时候将有可能执行以下操作：</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【1】PhantomReference引用过的heap对象声明为finalizable；</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#666699;"><span style="font-size:13px;">【2】虚引用在堆对象释放之前就添加到了它的ReferenceQueue里面，这种情况使得我们可以在堆对象被回收之前采取操作（*：再次提醒，PhantomReference对象必须经过关联的ReferenceQueue来创建，就是说必须和ReferenceQueue类配合操作）</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　看似没有用处的虚引用，有什么用途呢？</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#3366ff;"><span style="font-size:13px;">1.首先，我们可以通过虚引用知道对象究竟什么时候真正从内存里面移除的，而且这也是唯一的途径。</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#3366ff;"><span style="font-size:13px;">2.虚引用避过了finalize()方法，因为对于此方法的执行而言，虚引用真正引用到的对象是异常对象，若在该方法内要使用对象只能重建。一般情况垃圾回收器会轮询两次，一次标记为finalization，第二次进行真实的回收，而往往标记工作不能实时进行，或者垃圾回收其会等待一个对象去标记finalization。这种情况很有可能引起MemoryOut，而使用虚引用这种情况就会完全避免。因为虚引用在引用对象的过程不会去使得这个对象由Dead复活，而且这种对象是可以在回收周期进行回收的。</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　在JVM内部，虚引用比起使用finalize()方法更加安全一点而且更加有效。而finaliaze()方法回收在虚拟机里面实现起来相对简单，而且也可以处理大部分工作，所以我们仍然使用这种方式来进行对象回收的扫尾操作，但是有了虚引用过后我们可以选择是否手动操作该对象使得程序更加高效完美。</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><strong><span style="font-size:13px;">3.Java里面对象的生命周期</span></strong></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　在JVM运行空间里面，对象整个声明周期大致分为以下几个阶段：</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#339966;">创建阶段（Creating）-&gt;应用阶段（Using）-&gt;不可视阶段（Invisible）-&gt;不可达阶段（Unreachable）-&gt;可收集阶段（Collected）-&gt;终结阶段（Finalized）-&gt;释放阶段（Free）</span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　<strong>【1】创建阶段：</strong></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　创建过程需要经过其中几步：</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#3366ff;">为对象分配内存空间</span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">　　开始构造对象</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">　　递归调用超类的构造方法</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">　　进行对象实例初始化和变量初始化</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">　　执行构造方法体</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　<strong>【2】应用阶段特征：</strong></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　系统至少维护着对象的一个强引用（Strong Reference）</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　所有该对象的引用全部是强引用，除非我们显示声明了软引用、弱引用或者虚引用</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　<strong>【3】不可是视阶段：</strong></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　不可视阶段就是我们在区域代码中不可以再引用它，就是强引用已经消失，一般情况我们把这个时候的对象设置为null，其主要目的是让JVM发现它，并且可以及时回收该对象所占用资源</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　<strong>【4】不可到达阶段：</strong></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　不可达阶段的对象，在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用，这些对象通常是指所有线程栈中的临时变量以及相关引用，这种对象都是要预备回收的对象，但是这时候不能被GC直接回收。</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="color:#3366ff;"><span style="color:#000000;"><span style="font-size:13px;">　　【5】可收集阶段、终结阶段、释放阶段：</span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="color:#000000;"><span style="font-size:13px;">　　<span style="color:#3366ff;">对象生命周期最后一个阶段，这种阶段的对象可能处于三种状态：</span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">　　垃圾回收器发现对象已经不可达</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">　　finalize方法已经被执行</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="font-size:10px;"><span style="color:#3366ff;"><span style="font-size:13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对象已经被重用</span></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="COLOR: #3366ff"><span style="COLOR: #666699"><span style="FONT-SIZE: 13px"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #3366ff"><span style="COLOR: #000000"><span style="FONT-SIZE: 10px"><span style="color:#3366ff;"><strong><span style="color:#000000;"><span style="font-size:13px;">4.总结：</span></span></strong></span></span></span></span></span></span></span></span></span></span></p><p style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px" sizcache="1" sizset="33"><span style="COLOR: #3366ff" sizcache="1" sizset="33"><span style="COLOR: #666699" sizcache="1" sizset="33"><span style="FONT-SIZE: 13px" sizcache="1" sizset="33"><span style="COLOR: #3366ff" sizcache="1" sizset="33"><span style="COLOR: #000000" sizcache="1" sizset="33"><span style="COLOR: #ff0000" sizcache="1" sizset="33"><span style="COLOR: #3366ff" sizcache="1" sizset="33"><span style="color:#000000;"><span style="font-size:10px;"><span style="font-size:13px;">　　整个Java里面有关对象引用的内容我就整理了这些，基本上涵盖了大部分内容，如果有笔误希望阅读的人来信告知：</span><a href="mailto:silentbalanceyh@126.com"><span style="font-size:13px;">silentbalanceyh@126.com</span></a><span style="font-size:13px;">。</span></span></span></span></span></span></span></span></span></span></p>
</div>

<div class="share_buttons" id="sharePanel"></div>
<!--192.168.1.236-->
<div class="article_next_prev">
    <li class="prev_article"><span>上一篇：</span><a href="/zhao251021539/article/details/6599122">shiftone-cache 源码剖析</a></li>
    <li class="next_article"><span>下一篇：</span><a href="/zhao251021539/article/details/6601541">java 安全机制</a></li>
</div>


    
</div>
<div id="ad_cen">
<script type="text/javascript" >BAIDU_CLB_SLOT_ID = "117306";</script>
<script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"></script>
</div>
<script type="text/javascript">
    //new Ad(4, 'ad_cen');
</script>
<div id="comment_title" class="panel_head">查看评论<a name="comments"></a></div>
<div id="comment_list"></div>
<div id="comment_bar"></div>
<div id="comment_form"></div>
<div class="announce">* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场<a name="reply"></a><a name="quote"></a></div>
<script type="text/javascript">
    var fileName = '6599407';
    var commentscount = 1;
    var islock = false
</script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/comment.js"></script>
<div id="ad_bot"></div>
<script type="text/javascript">
    new Ad(5, 'ad_bot');
</script>
<div id="report_dialog"></div>

<div id="d-top" style="display:none;">
<a id="d-top-a" href="#" title="回到顶部">
<img src="http://static.blog.csdn.net/images/top.png" alt="TOP" /></a>
</div>
<script type="text/javascript">
    $(function(){
        var d_top=$('#d-top');
        document.onscroll=function(){
            var scrTop=(document.body.scrollTop||document.documentElement.scrollTop);
            if(scrTop>500){
                d_top.show();
            }else{
                d_top.hide();
            }
        }
        $('#d-top-a').click(function(){
            scrollTo(0,0);
            this.blur();
            return false;
        });
    });
</script>

<div class="clear"></div>
</div>
</div>

<div id="side">
<div class="side">
<div id="panel_Profile" class="panel">
<ul class="panel_head"><span>个人资料</span></ul>
<ul class="panel_body profile">
<div id="blog_userface">
    <a href="http://my.csdn.net/zhao251021539" target="_blank">
    <img src="http://avatar.csdn.net/2/3/4/1_zhao251021539.jpg" title="访问我的空间" style="max-width:90%"/>
    </a>
    <br />
    <span><a href="http://my.csdn.net/zhao251021539" class="user_name" target="_blank">zhao251021539</a></span>
</div>
<div class="interact">
<a href="javascript:void(0);" class="attent" id="span_add_follow" title="[加关注]"></a>
<a href="javascript:void(0);" class="letter" onclick="loginto(1)" title="[发私信]"></a>
</div>
<div id="blog_medal">
</div>
<ul id="blog_rank">
    <li>访问：<span>13489次</span></li>
    <li>积分：<span>781分</span></li>
    <li>排名：<span>第13539名</span></li>
</ul>
<ul id="blog_statistics">
    <li>原创：<span>61篇</span></li>
    <li>转载：<span>9篇</span></li>
    <li>译文：<span>0篇</span></li>
    <li>评论：<span>13条</span></li>
</ul>
</ul>
</div>



<div class="panel" id="panel_Search">
    <ul class="panel_head"><span>文章搜索</span></ul>
    <ul class="panel_body">
        <form id="frmSearch" action="http://so.csdn.net/search" class="form_search" target="_blank">
        <span><input id="inputSearch" type="text" class="blogsearch" title="请输入关键字" /></span>
        <input id="btnSubmit" type="submit" value="搜索" title="search in blog" />
        <input type="hidden" name="q" id="inputQ" />
        <input type="hidden" name="t" value="blog" />
        <a id="btnSearchBlog" target="_blank"></a>
        </form>
    </ul>
</div><div id="panel_Category" class="panel">
<ul class="panel_head"><span>文章分类</span></ul>
<ul class="panel_body">
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/848280">设计模式</a><span>(19)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/848281">领域驱动</a><span>(1)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/848282">java虚拟机</a><span>(8)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/848283">多线程编程</a><span>(4)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/848928">java</a><span>(10)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/848930">源码分析</a><span>(6)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/856903">算法学习</a><span>(3)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/857001">计算机英语</a><span>(1)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/857860">分布式</a><span>(1)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/858583">生活</a><span>(2)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/860025">NIO</a><span>(1)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/864869">设计模式进阶</a><span>(4)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/865416">集合包</a><span>(1)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/873926">WEB 方面</a><span>(3)</span>
</li>
<li>
<a href="http://blog.csdn.net/zhao251021539/article/category/1063179">关键词过滤系统</a><span>(2)</span>
</li>
</ul>
</div><div id="panel_Archive" class="panel">
<ul class="panel_head"><span>文章存档</span></ul>
<ul class="panel_body">
<div id="archive_list">
<!--归档统计-->
<li><a href="http://blog.csdn.net/zhao251021539/article/month/2012/10">2012年10月</a><span>(1)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2012/08">2012年08月</a><span>(1)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2012/03">2012年03月</a><span>(1)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2012/01">2012年01月</a><span>(3)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2011/12">2011年12月</a><span>(1)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2011/11">2011年11月</a><span>(1)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2011/09">2011年09月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2011/08">2011年08月</a><span>(15)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2011/07">2011年07月</a><span>(35)</span></li><li><a href="http://blog.csdn.net/zhao251021539/article/month/2011/04">2011年04月</a><span>(2)</span></li>
</div>
</ul>
</div>
<div id="hotarticls" class="panel">
<ul class="panel_head"><span>阅读排行</span></ul>
<ul class="panel_body itemlist">
<li>
<a href="/zhao251021539/article/details/7196428" title="关键字过滤系统（二）关键词匹配算法">关键字过滤系统（二）关键词匹配算法</a><span>(832)</span>
</li>
<li>
<a href="/zhao251021539/article/details/7342832" title="人人网面试题加答案">人人网面试题加答案</a><span>(575)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6599407" title="java reference">java reference</a><span>(571)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6634141" title="vistor模式">vistor模式</a><span>(491)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6647343" title="详解 java 内部类">详解 java 内部类</a><span>(381)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6767526" title="几天下来对于SSH的理解">几天下来对于SSH的理解</a><span>(324)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6648312" title="prototype原型模式，详解java Clone">prototype原型模式，详解java Clone</a><span>(298)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6737979" title="求 素数的几种算法（位图法，多线程）">求 素数的几种算法（位图法，多线程）</a><span>(290)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6820420" title="为了淘宝 。。。整理">为了淘宝 。。。整理</a><span>(242)</span>
</li>
<li>
<a href="/zhao251021539/article/details/7194852" title="关键词过滤系统（一）系统功能探究">关键词过滤系统（一）系统功能探究</a><span>(240)</span>
</li>
</ul>
</div>
<div id="hotarticls2" class="panel">
<ul class="panel_head"><span>评论排行</span></ul>
<ul class="panel_body itemlist">
<li>
<a href="/zhao251021539/article/details/6820420" title="为了淘宝 。。。整理">为了淘宝 。。。整理</a><span>(3)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6655459" title="你的学习是什么驱动的？">你的学习是什么驱动的？</a><span>(2)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6737979" title="求 素数的几种算法（位图法，多线程）">求 素数的几种算法（位图法，多线程）</a><span>(2)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6716425" title="Servlet 与 JSP 小结 纯概念">Servlet 与 JSP 小结 纯概念</a><span>(1)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6367672" title="jive 配置">jive 配置</a><span>(1)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6767526" title="几天下来对于SSH的理解">几天下来对于SSH的理解</a><span>(1)</span>
</li>
<li>
<a href="/zhao251021539/article/details/7871460" title="写给自己">写给自己</a><span>(1)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6599407" title="java reference">java reference</a><span>(1)</span>
</li>
<li>
<a href="/zhao251021539/article/details/7194852" title="关键词过滤系统（一）系统功能探究">关键词过滤系统（一）系统功能探究</a><span>(0)</span>
</li>
<li>
<a href="/zhao251021539/article/details/6683677" title="ArrayList LinkedList 源码分析">ArrayList LinkedList 源码分析</a><span>(0)</span>
</li>
</ul>
</div>
<div id="homepageArticles" class="panel">
<ul class="panel_head"><span>推荐文章</span></ul>
<ul class="panel_body" id="ad_commend"></ul>
</div>
<script type="text/javascript">
 new Ad(12, 'ad_commend');
</script><div id="newcomments" class="panel">
<ul class="panel_head"><span>最新评论</span></ul>
<ul class="panel_body itemlist">
    <li>
    <a href="/zhao251021539/article/details/6737979#comments">求 素数的几种算法（位图法，多线程）</a>
    <p style="margin:0px;"><a href="/Chobitssp" class="user_name">Chobitssp</a>:
跪...
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/7871460#comments">写给自己</a>
    <p style="margin:0px;"><a href="/zhj41620935" class="user_name">zhj41620935</a>:
在淘宝工作吗？呵呵
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/7191585#comments">中文化和国际化问题笔记</a>
    <p style="margin:0px;"><a href="/zhao251021539" class="user_name">zhao251021539</a>:
http://www.laicaoyuan.com/forum.php?mod=viewthread...
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6599407#comments">java reference</a>
    <p style="margin:0px;"><a href="/axl1988713" class="user_name">axl1988713</a>:
谢谢楼主，学习了。
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6820420#comments">为了淘宝 。。。整理</a>
    <p style="margin:0px;"><a href="/wanghuan203" class="user_name">wanghuan203</a>:
来看看..加油!
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6655459#comments">你的学习是什么驱动的？</a>
    <p style="margin:0px;"><a href="/ljjclub" class="user_name">ljjclub</a>:
一般是打完dota做一晚上的梦还是他
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6655459#comments">你的学习是什么驱动的？</a>
    <p style="margin:0px;"><a href="/Ck_vile" class="user_name">Ck_vile</a>:
“典型的罪恶感驱动，每次打完dota学习效率都很高”，你角色转换的速度挺快， 我们一般是打完dota...
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6676415#comments">生产者与消费者问题 各种写法</a>
    <p style="margin:0px;"><a href="/zhao251021539" class="user_name">zhao251021539</a>:
@其实是刚开始复习多线程写的 问题很多  明天我来改一下吧:
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6676415#comments">生产者与消费者问题 各种写法</a>
    <p style="margin:0px;"><a href="/puton" class="user_name">puton</a>:
关闭线程 最好用共享的信号runflag来控制  。interrupted是不安全，不准确的
    </p>
    </li>
    <li>
    <a href="/zhao251021539/article/details/6676415#comments">生产者与消费者问题 各种写法</a>
    <p style="margin:0px;"><a href="/puton" class="user_name">puton</a>:
查了下  exec.shutdownNow().size=0 ， 所有任务都停止了， 但exec.i...
    </p>
    </li>
</ul>
</div>
</div>
<div class="clear"></div>
</div>

<div class="clear"></div>
</div>

<script type="text/javascript" src="http://static.blog.csdn.net/scripts/newblog.min.js?v=1.1"></script>
<script type="text/javascript" src="http://medal.blog.csdn.net/showblogmedal.ashx?blogid=1083083"></script>

<script type="text/javascript" src="http://csdnimg.cn/pubfooter/js/publib_footer.js"></script>

<script type="text/javascript" src="http://passport.csdn.net/content/loginbox/login.js"></script>
<script type="text/javascript">document.write("<img src=http://counter.csdn.net/pv.aspx?id=24 border=0 width=0 height=0>");</script>
<script type="text/javascript" src="http://www.csdn.net/ui/scripts/Csdn/counter.js?v=1"></script>


<script type="text/javascript" src="http://ad.csdn.net/scripts/ad-blog.js"></script>

</div>
</body>
</html>